package com.ics.cmsadmin.modules.system.emums;

import com.ics.cmsadmin.frame.constant.Constants;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

import java.util.function.Predicate;

import static com.ics.cmsadmin.frame.constant.Constants.REGISTER_INTEGER_TIPS;
import static com.ics.cmsadmin.frame.utils.Tools.*;

@AllArgsConstructor
@Getter
public enum RegisterKeyValueEnum {
    /**
     * 下级推广订单
     * 一级代理商可以得到分润比例
     */
    ONE_AGENT_SHARE_RATE("one_agent_share_rate", "0",
        LessThan100_PREDICATE, "该配置必须为数字且小于等于100."),
//    /**
//     * 代理商的分润比例
//     */
//    AGENT_SHARE_RATE("agent_share_rate", Constants.NOT_KNOWN,
//        AGENT_SHARE_RATE_PREDICATE, "该配置有误,请参考'10%<100<15%<300<20%<600<25%'"),
    /**
     * 个人代理商的分润比例
     */
    PERSONAL_AGENT_SHARE_RATE("personal_agent_share_rate", Constants.NOT_KNOWN,
        AGENT_SHARE_RATE_PREDICATE, "该配置有误,请参考'10%<100<15%<300<20%<600<25%'"),
    /**
     * 企业代理商的分润比例
     */
    COMPANY_AGENT_SHARE_RATE("company_agent_share_rate", Constants.NOT_KNOWN,
        AGENT_SHARE_RATE_PREDICATE, "该配置有误,请参考'10%<100<15%<300<20%<600<25%'"),
    /**
     * 最多的提现申请记录数
     * (提现申请状态为"提现中"的数量)
     * 如果分销商的提现申请大于这个数量,这不能提现
     * -1 表示没有限制
     */
    APPLY_WITHDRAW_CASH_MAX_COUNT("apply_withdraw_cash_max_count", "-1",
        INTEGER_PREDICATE, REGISTER_INTEGER_TIPS),
    /**
     * 提现间隔时间(d)
     * -1 表示没有限制
     * @see #WITHDRAW_CASH_INTERVAL_MAX_ACCEPT_COUNT
     */
    APPLY_WITHDRAW_CASH_INTERVAL_DAY("apply_withdraw_cash_interval_day", "-1",
        INTEGER_PREDICATE, REGISTER_INTEGER_TIPS),
    /**
     * 提现间隔时间中 接受处理的最大申请次数
     * 也就说每隔多久,最多可以申请多少次提现记录
     * -1 表示没有限制
     * @see #APPLY_WITHDRAW_CASH_INTERVAL_DAY
     */
    WITHDRAW_CASH_INTERVAL_MAX_ACCEPT_COUNT("withdraw_cash_interval_max_accept_count", "-1",
        INTEGER_PREDICATE, REGISTER_INTEGER_TIPS),
    /**
     * 申请提现金额最小提现金额
     */
    APPLY_WITHDRAW_CASH_MIN_MONEY("apply_withdraw_cash_min_money", "0",
        NUMERIC_PREDICATE, REGISTER_INTEGER_TIPS),
    /**
     * 新增代理商时的默认用户角色
     */
    AGENT_DEFAULT_ROLE_ID("agent_default_role_id", Constants.NOT_KNOWN,
        TRUE_PREDICATE, ""),
    /**
     * 新增业务员时的默认用户角色(普通用户的角色)
     */
    USER_DEFAULT_ROLE_ID("user_default_role_id", Constants.NOT_KNOWN,
        TRUE_PREDICATE, ""),
    /**
     * 助理的默认角色
     */
    ASSISTANT_DEFAULT_ROLE_ID("assistant_default_role_id", Constants.NOT_KNOWN,
        TRUE_PREDICATE, ""),
    /**
     * 经理的默认角色
     */
    MANAGER_DEFAULT_ROLE_ID("manager_default_role_id", Constants.NOT_KNOWN,
        TRUE_PREDICATE, ""),
    /**
     * boss的默认角色
     */
    BOSS_DEFAULT_ROLE_ID("boss_default_role_id", Constants.NOT_KNOWN,
        TRUE_PREDICATE, ""),
    /**
     * 导出数据的最大限制
     */
    EXPORT_MAX_NUM("export_max_num", "5000",
        INTEGER_PREDICATE, REGISTER_INTEGER_TIPS),
    /**
     * 邮箱重置密码url路径
     */
    EMAIL_RESET_PASSWORD_URL("email_reset_password_url", "", TRUE_PREDICATE, ""),
    ;

    @Getter
    private String key;                      // 字典key 规定: key值必须是枚举name的小写形式
    private String defaultValue;            // 字典默认值
    private Predicate<String> valid;        // 新增修改字典值的检验函数
    private String description;             // 检验函数失败的提示语

    public static RegisterKeyValueEnum valueOfKey(String key){
        try {
            return RegisterKeyValueEnum.valueOf(StringUtils.upperCase(key));
        }catch (Exception e){
            return null;
        }
    }
}
